//package com.wangfei.test.filehandler.extractinfo;
//
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.apache.poi.ss.usermodel.*;
//
//import java.io.*;
//import java.net.Socket;
//import java.text.DecimalFormat;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Set;
//import java.util.regex.Matcher;
//
//public class GetIp {
//
//    public static Logger logger = LogManager.getLogger(GetIp.class);
//    public static String BSP_IP = "40.18.2.68";
//    public static int BSP_PORT = 20014;
//    public static int BSP_PORT1 = 20016;
//    public static String MODULE_PATH_NAME ="D:\\wangfei\\fireflyworkspace\\PROD\\01.src\\WLDMZ\\ZhyyhUOS\\ChannelInUOS";
//    public static String MODULE_OUT_PATH_NAME ="D:\\wangfei\\fireflyworkspace\\PROD\\01.src\\WLDMZ\\ZhyyhUOS\\ChannelOutUOS\\";
//    public static String RECORD_FILE_NAME = "D:\\intelJ\\2.txt";
//
//    public static void main(String[] args) throws Exception {
//        //xlsx file path
//        String inputFileName = "D:\\tmp\\Desktop\\desktop\\A3外联防火墙策略-1.xlsx";
//        String configFileName = "D:\\wangfei\\fireflyworkspace\\PROD\\01.src\\WLDMZ\\ZhyyhUOS\\resources\\config\\appParaConfig_10.21.5.32.apcd";
//
//        File file = new File(inputFileName);
//        Sheet sheet = null;
//        // 读取excel内容，确定端口
//        try (FileInputStream fis = new FileInputStream(file);
//             // creat XSSFWorkbook object for xlsx
//             XSSFWorkbook workbook = new XSSFWorkbook(fis);
//
//        ) {
//            // 根据excel里的哪个sheet获取
//            sheet = workbook.getSheetAt(1);
//            // get the number of rows in the sheet
//            int rows = sheet.getPhysicalNumberOfRows();
//            // iterat the rows
//
//            byte[] buf = new byte[1024];
//            int len = 0;
//            Matcher matcher = null;
//            logger.debug("hangshu: " + rows);
//            // 循环查找一个sheet中的每行的端口
//            for (int i = 1; i < rows; i++) {
//                logger.debug("\ndijihang: " + i);
//                Row row = sheet.getRow(i);
//
//                // 1. 获取端口，此处的第8列为端口
//                String port = getCellFormatValue(row.getCell(7)).toString();
//                if (port.indexOf("(") > 0) {
//                    port = port.substring(0, port.indexOf("(")).trim();
//                }
//                port = port.trim();
//                if ("".equals(port)) {
//                    continue;
//                }
//                logger.debug("端口：" + port);
//                // 2.根据端口在应用配置文件中查找保存端口的变量
//                String content = communication(BSP_IP, BSP_PORT, port);
//                logger.debug("ip串：" + content);
//                if("".equals(content.trim())) {
//                    continue;
//                }
//                String portStr4 = content.substring(6);
//                logger.debug("要查找的:" + portStr4);
//                String mappingPath = "";
//                // 3. 在模块module中查找响应模块
//                String contentPath = MODULE_PATH_NAME;
//                File contentDirec = new File(contentPath);
//                FileFilter filter = new FileFilter() {
//                    @Override
//                    public boolean accept(File pathname) {
//                        return pathname.toString().endsWith(".mrd");
//                    }
//                };
//                ArrayList<File> list = new ArrayList<File>();
//                logger.debug("list: " + rows);
//                list = getFileList(contentDirec, filter, list);
//                // 3.1 循环查找每个模块
//                for (int h = 0; h < list.size(); h++) {
//                    String argsStr = list.get(h).toString();
//                    StringBuilder sb1 = new StringBuilder();
//                    int len1 = 0;
//                    byte[] buf1 = new byte[200];
//                    try (
//                            FileInputStream fis1 = new FileInputStream(list.get(h));
//                            BufferedReader br1 = new BufferedReader(new InputStreamReader(fis1, "UTF-8"))) {
//                        while ((len1 = fis1.read(buf1)) != -1) {
//                            new String(buf1, 0, len1);
//                            sb1.append(new String(buf1, 0, len1));
//                        }
//
//                        String bookContent = new String(sb1.toString().getBytes("UTF-8"), "UTF-8");
//
//
//                        if (bookContent.indexOf(portStr4) < 0) {
//                            continue;
//                        }
//                        // 查到对应模块
//                        if (bookContent.indexOf(portStr4) >= 0) {
//                            logger.debug("是否查到 " + bookContent.indexOf(portStr4));
//                            logger.debug("++++ " + list.get(h));
//                            logger.debug("++++ " + portStr4);
//                            // 3.1.1 在该模块下的mapping表中查找对应业务系统
//                            mappingPath = list.get(h).getParent() + "\\mapping.mpd";
//                            logger.debug(mappingPath);
////                            logger.debug(commnication(readFile(mappingPath)));
//                            String mapRspString = commnication(readFile(mappingPath));
//                            if( mapRspString.length() <= 6) {
//                                continue;
//                            }
//                            // 相关业务系统map
//                            HashMap<String, String> map = mapStringToMap(mapRspString.substring(6));
//                            if (map == null ){
//                                continue;
//                            }
//                            Set<Map.Entry<String, String>> setNiu = map.entrySet();
//                            // 循环查找每个业务系统对应的地址（单个系统可以有多个地址）
//                            for(Map.Entry<String, String> entryNiu : setNiu) {
//                                // 在流程文件中查到对应的接出适配器
//                                String key = entryNiu.getKey().trim().substring(0, 3);
//                                String portFile = MODULE_OUT_PATH_NAME+key+"0OUT\\"+entryNiu.getValue()+"\\pcs\\"+entryNiu.getValue()+".diagram";
//                                String contentValue = readFile(portFile);
//                                if ("".equals(contentValue)) {
//                                    continue;
//                                }
//                                logger.debug("流程文件：" + portFile);
//                                logger.debug(contentValue.indexOf("shortClientOutAdapter"));
//                                if (contentValue.indexOf("shortClientOutAdapter") < 0) {
//                                    continue;
//                                }
//                                String adapterName= contentValue.substring(contentValue.indexOf("shortClientOutAdapter"));
//                                adapterName = adapterName.substring(0, adapterName.indexOf("&quot;\"/>"));
//                                logger.debug(adapterName);
//                                // 根据适配器找到对应的地址信息变量
//                                portFile = MODULE_OUT_PATH_NAME+key+"0OUT\\module.mrd";
//                                contentValue = readFile(portFile);
//                                int begin = contentValue.indexOf("id=\"" +  adapterName);
//                                contentValue = contentValue.substring(begin, begin + 300);
//                                String ipValue1 = contentValue.substring(contentValue.indexOf("host\" value=\"${")+15);
//                                ipValue1 = ipValue1.substring(0, ipValue1.indexOf("}"));
//                                logger.debug("contentValue: " + ipValue1);
//
//                                String portValue1 =contentValue.substring(contentValue.indexOf("port\" value=\"${")+15);
//                                portValue1 = portValue1.substring(0, portValue1.indexOf("}"));
//                                logger.debug("contentValue: " + portValue1);
//
//                                // 在应用配置文件中找到对应信息
//                                String configContent = readFile(configFileName);
//                                String ipValue = "";
//                                String tmpStr = configContent.substring(configContent.indexOf(ipValue1)+ipValue1.length()+9);
//                                ipValue = tmpStr.substring(0, tmpStr.indexOf("\""));
//                                logger.debug(ipValue);
//                                String portValue = "";
//                                tmpStr = configContent.substring(configContent.indexOf(portValue1)+portValue1.length()+9);
//                                portValue = tmpStr.substring(0, tmpStr.indexOf("\""));
//                                logger.debug(portValue);
//                                // 将对应信息写入文件，key-业务系统简称，port-端口，ipValue-业务系统ip，portValue-业务系统端口
//                                String writeContent = key + " - " + port + " - " + ipValue + " : " + portValue + "\n";
//                                writeFile(RECORD_FILE_NAME, writeContent);
//                                logger.debug("写入内容：" + writeContent);
//                            }
//
//                        }
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                        throw e;
//                    }
//
//                }
//                logger.debug("hangshumo: " + i);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 获取目录清单
//     * @param dir 目录地址
//     * @param filter 过滤器
//     * @param list
//     * @return
//     */
//    public static ArrayList<File> getFileList(File dir, FileFilter filter, ArrayList<File> list) {
//        File[] files = dir.listFiles();
//        for (File file : files) {
//            if (file.isDirectory()) {
//                getFileList(file, filter, list);
//            }
//            if (filter.accept(file)) {
//                list.add(file);
//            }
//        }
//        return list;
//    }
//
//    /**
//     * 获取对应单元格内容
//     * @param cell
//     * @return
//     */
//    public static Object getCellFormatValue(Cell cell) {
//        if (cell == null) {
//            return "wrong cell object";
//        }
//        Object cellData = null;
//        CellType cellType = cell.getCellType();
//        switch (cellType) {
//            case NUMERIC:
//                cellData = cell.getNumericCellValue();
//                DecimalFormat df = new DecimalFormat();
//                cellData = df.format(cellData);
//                break;
//            case STRING:
//                cellData = cell.getStringCellValue();
//                break;
//            case FORMULA:
//                if (DateUtil.isCellDateFormatted(cell)) {
//                    cellData = cell.getDateCellValue();
//                } else {
//                    cellData = String.valueOf(cell.getNumericCellValue());
//                }
//                break;
//            default:
//                cellData = "";
//        }
//        return cellData;
//    }
//
//    /**
//     * 交由Bsp20016端口查找mapping表中的所有业务系统
//     * @param content
//     * @return
//     * @throws Exception
//     */
//    public static String commnication(String content) throws Exception {
//        int len = 0;
//        byte[] buf = new byte[1024];
//        try (
//                Socket socket = new Socket(BSP_IP, BSP_PORT1);
//                OutputStream os = socket.getOutputStream();
//                PrintWriter pw = new PrintWriter(os);
//
//                InputStream is = socket.getInputStream();
//                BufferedInputStream br = new BufferedInputStream(is);
//        ) {
//            int length = content.getBytes("UTF-8").length;
//            String lengthStr = String.valueOf(length);
//            StringBuilder sHeaderLen = new StringBuilder();
//            int fillLen = 6 - lengthStr.length();
//            for (int g = 0; g < fillLen; g++) {
//                sHeaderLen.append('0');
//            }
//            sHeaderLen.append(length);
//            String head = sHeaderLen.toString();
//            pw.write(head + content);
//            pw.flush();
//            StringBuilder sb = new StringBuilder();
//            while ((len = br.read(buf)) != -1) {
//                sb.append(new String(buf, 0, len));
//            }
//            String contentResult = sb.toString();
//            return contentResult;
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw e;
//        }
//    }
//
//    /**
//     * 读文件
//     * @param file
//     * @return
//     */
//    public static String readFile(String file){
//
//
//        StringBuilder sb1 = new StringBuilder();
//        int len1 = 0;
//        byte[] buf1 = new byte[200];
//        try (
//                FileInputStream fis1 = new FileInputStream(file);
//                BufferedReader br1 = new BufferedReader(new InputStreamReader(fis1, "UTF-8"))) {
//            while ((len1 = fis1.read(buf1)) != -1) {
//                new String(buf1, 0, len1);
//                sb1.append(new String(buf1, 0, len1));
//            }
//            String bookContent = new String(sb1.toString().getBytes("UTF-8"), "UTF-8");
//            return bookContent;
//        } catch (Exception e) {
//            return "";
//        }
//    }
//
//
//    /**
//     * 字符串转Map对象
//     * @param str
//     * @return
//     */
//    public static HashMap<String, String> mapStringToMap(String str){
//
//        str = str.substring(1, str.length()-1);
//        String[] strs = str.split(",");
//        HashMap<String, String> map = new HashMap<String, String>();
//        if (str.indexOf("=") < 0) {
//            return null;
//        }
//        for( String string : strs) {
//            map.put(string.split("=")[0], string.split("=")[1]);
//        }
//        return map;
//    }
//
//    /**
//     * 写文件
//     * @param file
//     * @param content
//     * @return
//     * @throws Exception
//     */
//    public static boolean writeFile(String file, String content) throws Exception{
//        try (
//                BufferedWriter br1 = new BufferedWriter(new FileWriter(new File(file),true));) {
//                br1.write(content);
//                return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw e;
//        }
//    }
//
//    /**
//     * 交由BSP20014端口查找在应用配置中的端口变量，定长通讯6位
//     * @param port
//     * @return
//     * @throws Exception
//     */
//    public static String communication(String bspIp, int bspPort,String port) throws Exception{
//        try(Socket socket = new Socket(BSP_IP, BSP_PORT);
//            OutputStream os = socket.getOutputStream();
//            PrintWriter pw = new PrintWriter(os);
//
//            InputStream is = socket.getInputStream();
//            BufferedInputStream br = new BufferedInputStream(is);) {
//            int length = port.getBytes("UTF-8").length;
//            String lengthStr = String.valueOf(length);
//            StringBuilder sHeaderLen = new StringBuilder();
//            int fillLen = 6 - lengthStr.length();
//            for (int g = 0; g < fillLen; g++) {
//                sHeaderLen.append('0');
//            }
//            sHeaderLen.append(length);
//            String head = sHeaderLen.toString();
//            logger.debug(head + port);
//            pw.write(head + port);
//            pw.flush();
//            StringBuilder sb = new StringBuilder();
//            int len = 0;
//            byte[] buf = new byte[1024];
//            while ((len = br.read(buf)) != -1) {
//                sb.append(new String(buf, 0, len));
//            }
//            String content = sb.toString();
//            return content;
//        }catch (Exception e) {
//            e.printStackTrace();
//            throw e;
//        }
//    }
//
//}
